package common;

import java.io.*;
import java.util.*;

/**
 * @author lizi
 * @date 2020/4/10-22:57
 */
public class AppStart {
    public static void main(String[] args) {
        System.out.println("Hello World!");
        String tagsFolder = Const.TAGS_FOLDER;//Tags目录
        String jspFolder = Const.JSP_FOLDER;//JspFiles目录
        
        final File tagsfolder = new File(tagsFolder);//新建一个File类
        List<String> tagsfileList = new ArrayList<String>();//新建一个List列表用于存放Tags目录下的所有文件的完整路径
        HashMap<Integer,String> tags = new HashMap<Integer, String>();//用于存放从文件中取到的tag
        
        final File jspfolder = new File(jspFolder);//新建一个File类
        List<String> jspfileList = new ArrayList<String>();//新建一个List列表用于存放JspFiles目录下的所有文件的完整路径
        HashMap<Integer,String> jsps = new HashMap<Integer, String>();//用于存放从文件中取到的jsp
        CommonUtil.listFilesForFolder(tagsfolder,tagsfileList);//此方法可以获取该目录包含的所有的文件完整路径，因为list是引用数据类型所以不用返回值
        CommonUtil.listFilesForFolder(jspfolder,jspfileList);
        //String[] strtags={};//建一个字符串数组
        //for (String fileFuLLPath:tagsfileList){
        //    strtags = prvtags(fileFuLLPath);//循环取值到数组里，经过询问发现这里因为是读单文件所以其实用不上
        //}
        HashMap<String,HashMap<Integer,String>> ContentInFiles= new HashMap<String,HashMap<Integer,String>>();
        for (String str:tagsfileList){
            getContentInFilesNoJing(str,ContentInFiles);//通过文件路径，读取文件内容
        }
        Set<String> keys=ContentInFiles.keySet();
        for (String str1:keys){
            tags.putAll(ContentInFiles.get(str1));//把获取到的标签传到tags中
        }
        HashMap<String,HashMap<Integer,String>> ContentInFiles2= new HashMap<String,HashMap<Integer,String>>();
        for (String str:jspfileList){
            getContentInFiles(str,ContentInFiles2);//通过文件路径，读取文件内容
        }
        Set<String> keys2=ContentInFiles2.keySet();
        for (String str1:keys2){
            jsps.putAll(ContentInFiles2.get(str1));//把获取到的标签传到tags中
            System.out.println(str1+":");
            count(tags,jsps);
        }







    }

    private static void count(HashMap<Integer, String> tags, HashMap<Integer, String> jsps) {
    	HashMap<String,Integer>countMap=new HashMap<String,Integer>();
    	int num=0;
    	int startNum=0;
    	int endNum=0;
    	int i = 0,j=0;
    	Integer[] geshu=new Integer[tags.keySet().size()];
    	for(Integer lineNumTags:tags.keySet()) {
    		for(Integer lineNumJsps:jsps.keySet()) {
    			String str1=jsps.get(lineNumJsps);
    			String str2=tags.get(lineNumTags);
//    			String[] str1=jsps.get(lineNumJsps).split(tags.get(lineNumTags));
//        		String[] str2=jsps.get(lineNumJsps).split(tags.get(lineNumTags).replaceAll("<", "</"));
//        		System.out.println("本行分得字符串数组："+str1.length);
//        		for(int i=str1.length;i>1;i--) {
//        			startNum++;
//        		}
//        		for(int i=str2.length;i>1;i--) {
//        			endNum++;
//        		}
    			while(str1.indexOf(str2)!=-1) {
    				str1 = str1.substring(str1.indexOf(str2)+str2.length(), str1.length());
    				startNum++;
    				
    				
    			}
    			str1=jsps.get(lineNumJsps);
    			while(str1.indexOf(str2.replaceAll("<", "</"))!=-1) {
    				str1 = str1.substring(str1.indexOf(str2.replaceAll("<", "</"))+str2.replaceAll("<", "</").length(), str1.length());
    				endNum++;
    			}
    			i+=startNum;
    			j+=endNum;
    			startNum=0;
    			endNum=0;
    		}
    		System.out.print(tags.get(lineNumTags)+":");
    		System.out.print(i+" ");
    		System.out.print(tags.get(lineNumTags).replaceAll("<", "</")+":");
    		System.out.println(j);
    		i=0;
    		j=0;
    		num+=startNum-endNum;
    		countMap.put(tags.get(lineNumTags), num);
    	}
    	
		
	}

	private static void getContentInFiles(String fileFullPath, HashMap<String, HashMap<Integer, String>> FilesMap){
        String strtags0="";//临时存值用
        HashMap<Integer,String>lineMap=new HashMap<Integer, String>();//建一个hashmap用于存每行的文本，键为行号
        try {
            String motoFile = fileFullPath;//用于存文件路径
            FileReader fr = new FileReader(motoFile);//读文件类
            BufferedReader bf=new BufferedReader(fr);//缓冲类 据说节约性能
            String str;//暂存
            int count=1;//计行数用
            while ((str=bf.readLine())!=null){//讲值传给str同时验证这一行还有没有内容，没有则说明到达文尾
                System.out.println(str);
                lineMap.put(count,str);
                count++;//行号+1
            }
            bf.close();
            fr.close();
            String filename=null;
            String[] cutFileFullPath=fileFullPath.split("\\\\");
            for (String str1:cutFileFullPath){
                filename=str1;
            }
            System.out.println("文件名是："+filename);

            FilesMap.put(filename,lineMap);
            System.out.println(FilesMap.get("Tags.txt"));
        }catch (IOException e){
            e.printStackTrace();
        }

    }
	
	private static void getContentInFilesNoJing(String fileFullPath, HashMap<String, HashMap<Integer, String>> FilesMap){
        String strtags0="";//临时存值用
        HashMap<Integer,String>lineMap=new HashMap<Integer, String>();//建一个hashmap用于存每行的文本，键为行号
        try {
            String motoFile = fileFullPath;//用于存文件路径
            FileReader fr = new FileReader(motoFile);//读文件类
            BufferedReader bf=new BufferedReader(fr);//缓冲类 据说节约性能
            String str;//暂存
            int count=1;//计行数用
            while ((str=bf.readLine())!=null){//讲值传给str同时验证这一行还有没有内容，没有则说明到达文尾
                if (!str.startsWith("#")){
                    lineMap.put(count,str);//排除由#开头的行,同时将行号和本行文本存进map
                }
                if (!str.startsWith("<")&&!str.startsWith("#")&&!str.endsWith(">")){
                    System.out.println(str+"may not be a tag");//如果本行不是一个标签则做出提示 标签应由“<”开头，“>”结尾
                }
                count++;//行号+1
            }
            bf.close();
            fr.close();
            String filename=null;
            String[] cutFileFullPath=fileFullPath.split("\\\\");
            for (String str1:cutFileFullPath){
                filename=str1;
            }
            System.out.println("文件名是："+filename);

            FilesMap.put(filename,lineMap);
            System.out.println(FilesMap.get("Tags.txt"));
        }catch (IOException e){
            e.printStackTrace();
        }

    }

    
    private static String[] prvtags(String fileFullPath){
        String strtags0="";//临时存值用
        Map<Integer,String>lineMap=new HashMap<Integer, String>();//建一个hashmap用于存每行的文本，键为行号
        try {
            String motoFile = fileFullPath;//用于存文件路径
            FileReader fr = new FileReader(motoFile);//读文件类
            BufferedReader bf=new BufferedReader(fr);//缓冲类 据说节约性能
            String str;//暂存
            int count=0;//计行数用
            while ((str=bf.readLine())!=null){//讲值传给str同时验证这一行还有没有内容，没有则说明到达文尾
                if (!str.startsWith("#")){
                    lineMap.put(count,str);//排除由#开头的行,同时将行号和本行文本存进map
                }
                if (!str.startsWith("<")&&!str.startsWith("#")&&!str.endsWith(">")){
                    System.out.println(str+"may not be a tag");//如果本行不是一个标签则做出提示 标签应由“<”开头，“>”结尾
                }
                count++;//行号+1
            }
            bf.close();
            fr.close();
        }catch (IOException e){
            e.printStackTrace();
        }
        String[] strtags = new String[lineMap.size()];
        for (int i=0;i<lineMap.size();i++){
            strtags[i]=lineMap.get(i);
        }
        return strtags;
    }
}
